package org.dromara.common.core.domain;

import cn.hutool.core.util.ObjectUtil;
import org.dromara.common.core.constant.HttpStatus;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class PageData<T> extends HashMap<String, Object> implements Map<String, Object> {

  private final long serialVersionUID = 1L;

  private T data;
  /**
   * 初始化一个新创建的 对象，使其表示一个空消息。
   */
  public PageData() {
  }

  public T getData() {
    return data;
  }

  public void setData(T data) {
    this.data = data;
  }

  private PageData<T> restResult(T data, int code, String msg) {
    super.put("code", code);
    super.put("msg", msg);
    if (ObjectUtil.isNotNull(data)){
      this.data = data;
      super.put("data", data);
    }
    return this;
  }

  /**   * 返回成功消息   */
  public PageData success() {
    return this.success("操作成功");
  }

  /**   * 返回成功数据   */
  public PageData success(T data) {
    return this.success("操作成功", data);
  }

  /**   * 返回成功消息   */
  public PageData success(String msg) {
    return this.success(msg, null);
  }

  /**
   * 返回成功消息
   *
   * @param msg  返回内容
   * @param data 数据对象
   * @return 成功消息
   */
  public PageData success(String msg, T data) {
    return this.restResult(data, HttpStatus.SUCCESS, msg);
  }

  /**   * 返回错误消息   */
  public PageData error() {
    return this.error("操作失败");
  }

  /**   * 返回错误消息   */
  public PageData error(String msg) {
    return this.error(msg, null);
  }

  /**   * 返回错误消息   */
  public PageData error(String msg, T data) {
    return this.restResult(data, HttpStatus.ERROR, msg);
  }

  /**   * 是否为成功消息   */
  public boolean isSuccess() {
    return Objects.equals(HttpStatus.SUCCESS, this.getInt("code"));
  }

  /** 是否为错误消息   */
  public boolean isError() {
    return Objects.equals(HttpStatus.ERROR, this.getInt("code"));
  }

  /**
   * 方便链式调用
   *
   * @param key   键
   * @param value 值
   * @return 数据对象
   */
  @Override
  public PageData put(String key, Object value) {
    super.put(key, value);
    return this;
  }

  /**
   * * 判断一个对象是否为空
   *
   * @param key Object
   * @return true：为空 false：非空
   */
  public boolean isNull(String key) {
    return this.get(key) == null;
  }

  /**
   * 转成String类型的
   */
  public String getString(String str) {
    String res;
    try {
      res = this.get(str).toString();
    } catch (Exception e) {
      res = null;
    }
    return res;
  }

  /**   * 转成Long类型的   */
  public int getInt(String str) {
    int res;
    try {
      res = Integer.parseInt(this.getString(str));
    } catch (Exception e) {
      res = -100;
    }
    return res;
  }

  /**
   * 转成Long类型的
   */
  public Long getLong(String str) {
    Long res;
    try {
      res = Long.valueOf(this.getString(str));
    } catch (Exception e) {
      res = null;
    }
    return res;
  }

  /**
   * 转成Double类型的
   */
  public double getDouble(String str) {
    Double res;
    try {
      res = Double.valueOf(this.getString(str));
    } catch (Exception e) {
      res = null;
    }
    return res;
  }

}
